package com.example.csmall.product.service.impl;

import com.example.csmall.product.ex.ServiceException;
import com.example.csmall.product.mapper.AlbumMapper;
import com.example.csmall.product.pojo.dto.AlbumAddNewDTO;
import com.example.csmall.product.pojo.dto.AlbumUpdateDTO;
import com.example.csmall.product.pojo.entity.Album;
import com.example.csmall.product.pojo.vo.AlbumListItemVO;
import com.example.csmall.product.pojo.vo.AlbumStandardVO;
import com.example.csmall.product.service.AlbumService;
import com.example.csmall.product.web.ServiceCode;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AlbumServiceImpl implements AlbumService {

    @Autowired
    AlbumMapper albumMapper;

    @Override
    public void addNew(AlbumAddNewDTO albumAddNewDTO) {
        //获取DTO中的name属性值
        String name = albumAddNewDTO.getName();
        //通过name属性值查询表中记录数量
        int countName = albumMapper.countName(name);
        //判断表中数量是否大于0
        if(countName>0){
            //当表中数量大于0抛出异常
            String message="相册名已经存在"+albumAddNewDTO.getName();
            //ServiceException中设定了外界调用此异常时需要传递具体的错误代码和错误描述。
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }
        //若没有进入上述if，则执行到此创建Album对象
        Album album = new Album();
        //将albumAddNewDTO对象中和album对象里面属性名相同的属性值复制给album
        BeanUtils.copyProperties(albumAddNewDTO,album);
        //执行mapper中insert方法，执行向表中添加数据
        int rows = albumMapper.insert(album);
        if(rows != 1){
            String message="添加相册详情失败，服务器正忙，请稍后重试!";
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
    }

    @Override
    public void deleteById(Long id) {
        //在此处，我们应该先判定此id在表中是否存在数据，这种判定更加符合我们的设计思想
        AlbumStandardVO standardById = albumMapper.getStandardById(id);
        if(standardById == null){
            String message = "删除数据失败，数据不存在";
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        int rows = albumMapper.deleteById(id);
        if(rows != 1){
            String message="删除相册详情失败，服务器正忙，请稍后重试!";
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }

    @Override
    public void updateInfoById(Long id, AlbumUpdateDTO albumUpdateDTO) {
        //根据id判断要修改的数据是否存在
        AlbumStandardVO standardById = albumMapper.getStandardById(id);
        if(standardById==null){
            String message = "修改数据失败，想要修改的数据不存在";
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }

        //根据name和非id作为条件，来统计表中是否存在除了此id外和此name是字段同名的记录
        int i = albumMapper.countByNameAndNotId(id, albumUpdateDTO.getName());
        if(i>=1){
            String message = "修改数据失败，您输入的名称已经存在";
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }

        Album album = new Album();
        BeanUtils.copyProperties(albumUpdateDTO,album);
        album.setId(id);
        int rows = albumMapper.updateInfoById(album);
        if(rows != 1){
            String message="修改相册详情失败，服务器正忙，请稍后重试!";
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }

    @Override
    public AlbumStandardVO getStandardById(Long id) {
        AlbumStandardVO standardById = albumMapper.getStandardById(id);
        if(standardById == null){
            String message = "没有查询到对应的相册数据";
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return standardById;
    }

    @Override
    public List<AlbumListItemVO> list() {
        List<AlbumListItemVO> list = albumMapper.list();
        return list;
    }


}
